package main

import (
	"fmt"
)

//defer会在函数返回之前才执行
//且多个defer语句 遵循栈的特性 先进后出
func testDefer1(){
  defer fmt.Println("hello")
  defer fmt.Println("hello v2")
  defer fmt.Println("hello v3")
  fmt.Println("aaaaa")
  fmt.Println("bbbbb")
}

func testDefer2(){
  for i := 0; i < 5; i++ {
    defer fmt.Printf("i=%d\n",i)
  }

  fmt.Printf("returnning\n")
  fmt.Printf("return")
}

func testDefer3(){
  var i int = 0
  defer fmt.Printf("i=%d\n",i) //这个i 不会变 在这里defer定义的时候就已经决定了
  i=1000
  fmt.Printf("i=%d\n",i)
}

func main() {
  //testDefer1()
  //fmt.Println("----------")
/*
 aaaaa
 bbbbb
 hello v3
 hello v2
 hello
 ----------
*/


  //testDefer2()
/*
returnning
returni=4
i=3
i=2
i=1
i=0
*/


  testDefer3()
/*
   i=1000
   i=0
*/
}
